package algorithms.question.class13;

import common.util.MyUtil;

/**
 * 谷歌面试题原题
 * 面值为1~10的牌组成一组，
 * 每次你从组里等概率的抽出1~10中的一张
 * 下次抽会换一个新的组，有无限组
 * 当累加和<17时，你将一直抽牌
 * 当累加和>=17且<21时，你将获胜
 * 当累加和>=21时，你将失败
 * 返回获胜的概率
 * <p>
 * <p>
 * 谷歌面试题扩展版
 * 面值为1~N的牌组成一组，
 * 每次你从组里等概率的抽出1~N中的一张
 * 下次抽会换一个新的组，有无限组
 * 当累加和<a时，你将一直抽牌
 * 当累加和>=a且<b时，你将获胜
 * 当累加和>=b时，你将失败
 * 返回获胜的概率，给定的参数为N，a，b
 *
 * @author guichang
 * @date 2021/8/9
 */

@SuppressWarnings("all")
public class Code1_获胜的概率 {

    public static void main(String[] args) {
        MyUtil.print(pw1());
    }

    /**
     * 原题解
     */
    public static double pw1() {
        return process1(0);
    }

    public static double process1(int sum) {
        if (sum >= 17 && sum < 21) {
            return 1.0;
        }
        if (sum >= 21) {
            return 0.0;
        }
        double pw = 0;
        for (int i = 1; i <= 10; i++) {
            pw += process1(sum + i);
        }
        return pw / 10;
    }

    /**
     * TODO 扩展解
     */

}